package main

import (
	"fmt"
	"log"

	"game-simple/internal/framework"
	"game-simple/internal/infrastructure/config"
	"game-simple/internal/infrastructure/core"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"

	// Swagger 文档（需要先运行: make swagger-web）
	_ "game-simple/docs/web"
)

// @title           Game Simple Web API
// @version         1.0
// @description     基于 Gin + GORM + MySQL + Redis 的游戏简单 Web API（PC Web 端）
// @termsOfService  https://github.com/game-simple

// @contact.name   API Support
// @contact.url    https://github.com/game-simple
// @contact.email  support@game-simple.com

// @license.name  MIT
// @license.url   https://opensource.org/licenses/MIT

// @host      localhost:8080
// @BasePath  /api

// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @description JWT 认证，格式: "Bearer {token}"

func main() {
	// 加载配置（配置文件与 main.go 在同一目录）
	if err := config.LoadConfig("cmd/web/config.yaml"); err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 初始化所有基础设施（数据库、Redis、日志）
	if err := core.Init(); err != nil {
		log.Fatalf("初始化基础设施失败: %v", err)
	}
	defer core.Close()

	// 获取基础设施实例
	infra := core.Get()

	infra.Logger.Infof("Web API 应用启动中...")

	// 设置 Gin 模式
	gin.SetMode(config.GetConfig().Server.Mode)

	infra.Logger.Infof("数据库连接成功")
	infra.Logger.Infof("Redis 连接成功")

	// 创建 Gin 路由
	r := gin.Default()

	// 设置中间件
	r.Use(gin.Logger())
	r.Use(gin.Recovery())

	// Swagger 文档路由（需要先运行 make swagger-web 生成文档）
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 注册 Web API 模块路由
	webModule := framework.NewWebModule()
	webModule.SetupRoutes(r)

	// 启动服务器
	port := config.GetConfig().Server.Port
	infra.Logger.Infof("Web API 服务器启动在端口: %d", port)
	infra.Logger.Infof("Web API 地址: http://localhost:%d/api", port)
	infra.Logger.Infof("Swagger 文档地址: http://localhost:%d/swagger/index.html", port)
	if err := r.Run(fmt.Sprintf(":%d", port)); err != nil {
		infra.Logger.Errorf("Web API 服务器启动失败: %v", err)
		log.Fatalf("Web API 服务器启动失败: %v", err)
	}
}

